2681. 英雄的力量

2681. 英雄的力量

Similar Question

Solution Tips

方案一: 回溯 - 组合 + 数学

空间复杂度超了

即使去掉 chosen 也会超时, 回溯算法的时间复杂度是指数级的.

var sumOfPower = function(nums) {
    // 首先这里有一个组合, 要先选取不同的组合
    // 回溯选取, 每次 push 的时候只需要比较最大和最小有没有变化就行了
    let res = 0;
    // const map = new Map();
    backtracking([], 0, Number.MAX_SAFE_INTEGER, 0);

    function backtracking(chosen, max, min, curIndex) {
        if (curIndex >= nums.length) {
            const key = `${max}&${min}`;
            // if (map.has(`${max}&${min}`)) return res += map.get(key);
            // 根据 max 和 min 计算
            if (chosen.length > 0) {
                // 得用大数乘法, 但是很多 max 和 min 其实是一样的, 没必要重复算
                // res += (max * max * min) % (Math.pow(10, 9) + 7)
                // 等于分别取模然后相乘
                sum = (((max * max) % (Math.pow(10, 9) + 7)) * min) % (Math.pow(10, 9) + 7);
                // map.set(key, sum);
                res += sum;
            }
            return;
        }

        // 不选择当前 nums 的 case
        backtracking(chosen, max, min, curIndex + 1);
        // 选择当前 nums 的 case
        chosen.push(nums[curIndex]);
        max = Math.max(max, nums[curIndex]);
        min = Math.min(min, nums[curIndex]);
        backtracking(chosen, max, min, curIndex + 1);
    }

    // function bigMultiple(a, b) {

    // }

    return res;
};

// console.log(sumOfPower([2, 1, 4]))
console.log(sumOfPower([2, 1, 4]))

两个 for 循环并不能找到所有的组合, [1, 4] 就漏掉了

var sumOfPower = function(nums) {
    // 排序之后选
    nums = nums.sort((a, b) => a - b);
    let res = 0;

    for (let i = 0; i < nums.length; i++) {
        for (let j = i; j < nums.length; j++) {
            // 选择 [i, j] 的区间, min 为 i, max 为 j
            const max = nums[j];
            const min = nums[i];
            const sum = (((max * max) % (Math.pow(10, 9) + 7)) * min) % (Math.pow(10, 9) + 7);
            console.log('sum', sum);
            res += sum
        }
    }

    return res;
};

console.log(sumOfPower([1, 2, 4]))